// #include "TcpServer.hxx"

// #include "TcpServer_Thread.hxx"
#include "TcpServer_Thread_ShortTask.hxx"
#include "Daemon.hpp"
#include <string>
#include <iostream>
#include <cctype>
void Usage(const std::string& proc)
{
    //bind 单ip版本
    // std::cout<<"Usage: \n\t"<<proc<< " local_ip local_port\n";

    std::cout<<"Usage: \n\t"<<proc<< "local_port\n";
}


namespace myService{
    std::string Read(int sockfd)
    {
        char sock_buffer[1024];
        ssize_t n = read(sockfd,sock_buffer,sizeof(sock_buffer)-1);
        if(n>0)
        {
            sock_buffer[n] = 0;

        }
        else if(n==0)//读端读取到0，就是写端关闭了，在网络就是对端关闭了链接
        {
            lg(Log::Debug,"Client quit\n");
            return "EXIT!";
        }
        return sock_buffer;
    }
    void fdstream(int sockfd,std::fstream &fs)
    {
        fs.open("Common.hpp",std::fstream::in | std::fstream::out | std::fstream::app);
        if(!fs.is_open())
        {
            fs.open("Common.hpp",std::fstream::in | std::fstream::out | std::fstream::app);
        }
        static auto helper = [](std::filebuf& fb) -> int {
        class Helper : public std::filebuf {
        public:
        int handle() { return _M_file.fd(); }
        };

        return static_cast<Helper&>(fb).handle();
        };
        int myfd = helper(*fs.rdbuf());
        dup2(sockfd,myfd);
    }
    void Translate(int sockfd,InetAddr addr)
    {

        //使用C++的流式输出
        ///=------------------------------
        std::fstream fs;
        fdstream(sockfd,fs);

        EngExplain trans;
        static std::string DictUsage = "每次一行输入一个单词查询意思,输入\"EXIT!\"退出\n";
        fs<<DictUsage;
        fs.flush();
        std::string usrstr;
        
        while(( fs<<"\nPlease Enter:",
                fs.flush(),1)&&
            (usrstr = Read(sockfd))!= "EXIT!")
        {
            fs<<trans(usrstr)<<std::endl;
            fs.flush();
        }
    }


    void Ping(int sockfd,InetAddr addr){
        std::string echo_string = "server echo%: Ping Success\n";
        echo_string;
        std::fstream fs;
        fdstream(sockfd,fs);
        fs<<echo_string;
        fs.flush();
    }
};




int main(int argc,char* argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return Usage_error;
    } 
    // std::string ip = argv[1];
    // uint16_t port = std::stoi(argv[2]);
    // std::unique_ptr<UdpServer> usvr = std::make_unique<UdpServer>(ip,port);

    uint16_t port = std::stoi(argv[1]);

    //守护进程化，需要在绑定端口之前，否则端口被可能被父进程抢走
    // Daemon(0,0);
    TcpServer  tcp(port);

    function<void(int ,InetAddr)>  Transform= [](int sockfd,InetAddr addr){
        char message[128];
        int n = read(sockfd, message, sizeof(message) - 1); // tcp中要正确的读取，必须结合用户协议！！
        if (n > 0)
            message[n] = 0;
        std::string messagebuf = message;

        std::transform(messagebuf.begin(), messagebuf.end(), messagebuf.begin(), [](unsigned char c){
            return std::toupper(c);
        });
        write(sockfd, messagebuf.c_str(), messagebuf.size());
    };
    
    // function<void(int ,InetAddr)>  Transform= [](int sockfd,InetAddr addr){

    //     //fstream在同时使用>> ,<<会出现问题
    //     //先使用了某一个，下一个有可能就无效了，目前未知原因。
    //      已解决，使用fs.clear(),来清楚状态即可。
    // std::cout<<fs.bad()<<fs.eof()<<std::endl;
    // //C++的fstream在读取之后呢，会设置eof，因此需要clear清楚
    // fs.clear();
    // std::cout<<fs.bad()<<fs.eof()<<std::endl;


    //     std::fstream fs;
    //     myService:: fdstream(sockfd,fs);
    //     std::string s;
    //     fs<<"Begin Trans,请在输入完要变成大写的后面加上一个空格或者制表符\n";
    //     fs.flush();
    //     fs.sync();
    //     fs>>s;
    //     //
    //     myService:: fdstream(sockfd,fs);
    //     fs<<s;
    //     fs.flush();
    // };
    tcp.AddTask("translate",myService::Translate);
    tcp.AddTask("transform",Transform);
    tcp.AddTask("ping",myService:: Ping);
    tcp.Init();
    tcp.Start();
    return 0;
}